//package org.alvin.gencode.design;
//
//import com.deepoove.poi.XWPFTemplate;
//import com.deepoove.poi.data.DocxRenderData;
//import com.deepoove.poi.data.MiniTableRenderData;
//import com.deepoove.poi.data.RowRenderData;
//import com.deepoove.poi.data.TextRenderData;
//import lombok.extern.slf4j.Slf4j;
//import org.alvin.gencode.AbstractService;
//import org.alvin.gencode.beans.PropConfig;
//import org.alvin.gencode.run.code.*;
//import org.alvin.gencode.run.service.JDBC2MbTypeService;
//import org.alvin.gencode.run.service.VmFileService;
//import org.alvin.mini_inject.annotations.MiniComponent;
//import org.alvin.mini_inject.annotations.MiniInject;
//import org.apache.commons.compress.utils.Lists;
//
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.sql.SQLException;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
//@Slf4j
//@MiniComponent
//public class GenDocWithTemplateService extends AbstractService {
//
//    @MiniInject
//    private CodeDao codeDao;
//    @MiniInject
//    private PostgreCodeDao postgreCodeDao;
//
//    @MiniInject
//    private VmFileService vmFileService;
//    @MiniInject
//    private JDBC2MbTypeService jdbc2MbTypeService;
//
//
//    @Override
//    public ICodeDao getCodeDaoByType(String dbType) {
//        if ("postgre".equals(dbType)) {
//            return this.postgreCodeDao;
//        }
//        return this.codeDao;
//    }
//
//
//    @Override
//    public void doCreate(List<Table> tables, PropConfig propConfig) throws SQLException, IOException {
//        Map<String, Object> resultData = new HashMap<>();
//
//
//        //子模板
//        List<Map<String, Object>> params = Lists.newArrayList();
//        for (int i = 0; i < tables.size(); i++) {
//            Table table = tables.get(i);
//            Map<String, Object> tablePamras = new HashMap<>();
//
//            RowRenderData header = RowRenderData.build(
//                    new TextRenderData("FF0000", "字段名"),
//                    new TextRenderData("FF0000", "数据库列名"),
//                    new TextRenderData("FF0000", "Type"),
//                    new TextRenderData("FF0000", "JAVA Type"),
//                    new TextRenderData("FF0000", "Length"),
//                    new TextRenderData("FF0000", "PK"),
//                    new TextRenderData("FF0000", "Default"),
//                    new TextRenderData("FF0000", "Description")
//            );
//            List<Field> fList = this.getFields(table, propConfig);
//            List<RowRenderData> rows = fList.stream().map(item ->
//                    {
//                        String pk = "N";
//                        if (item.getColumn_key() != null) {
//                            if (item.getColumn_key().equals("PK")) {
//                                pk = "Y";
//                            }
//                        }
//                        return RowRenderData.build(item.getLower_camel(), item.getName(), item.getDbType()
//                                , item.getAllTypeName(), item.getLength() + "", pk, "-", item.getComment());
//                    }
//
//            ).collect(Collectors.toList());
//            tablePamras.put("title", table.getC_name());
//            tablePamras.put("table", new MiniTableRenderData(header, rows));
//            params.add(tablePamras);
//        }
//        //嵌入
//        DocxRenderData docxRenderData = new DocxRenderData(this.getClass().getResourceAsStream("/templates/docsub.docx"), params);
//        resultData.put("tables", docxRenderData);
//        //主模板
//        XWPFTemplate template = XWPFTemplate.compile(this.getClass().getResourceAsStream("/templates/docmain.docx"))
//                .render(resultData);
//        String outDir = propConfig.getConfigDir().concat(File.separator).concat("dist");
//        File dir = new File(outDir);
//        dir.mkdirs();
//
//        File file = new File(dir, "数据库设计文档.docx");
//        if (file.exists() && file.isFile()) {
//            file.delete();
//        }
//        //输出
//        FileOutputStream out = new FileOutputStream(file);
//        template.write(out);
//        out.flush();
//        out.close();
//        template.close();
//    }
//
//}
